#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
数据库初始化脚本
确保所有模型更改被正确应用到数据库
"""

import os
import sys
from app.__init__ import app, db

# 确保在应用上下文中运行
with app.app_context():
    # 删除旧的数据库文件
    db_paths = ['vulnerability_scanner.db', 'instance/vulnerability.db', 'instance/vulnerability_scanner.db']
    for db_path in db_paths:
        if os.path.exists(db_path):
            print(f"删除旧数据库文件: {db_path}")
            os.remove(db_path)
    
    # 导入所有模型以确保它们被注册
    print("导入数据库模型...")
    # 先导入所有可能的模型文件，确保它们被正确注册
    from app.models import user, database
    
    # 显式导入每个模型类
    from app.models.user import User, UserPreference
    from app.models.database import Scan, Vulnerability, TaskStatus, TargetRange, Schedule
    
    print(f"已注册的模型: {db.Model.__subclasses__()}")
    
    # 创建所有表
    print("创建数据库表...")
    db.create_all()
    print("✓ 数据库表创建成功！")
    
    # 确认users表是否已创建
    from sqlalchemy import inspect
    inspector = inspect(db.engine)
    existing_tables = inspector.get_table_names()
    print(f"数据库中的表: {existing_tables}")
    
    # 如果users表存在，则创建默认用户
    if 'users' in existing_tables:
        print("\n创建默认用户账号...")
        
        # 创建管理员用户
        admin_user = User(
            username='admin',
            email='admin@example.com',
            role='admin',
            organization='系统管理',
            department='安全运维'
        )
        admin_user.set_password('admin123')
        db.session.add(admin_user)
        
        # 创建普通用户
        regular_user = User(
            username='user1',
            email='user1@example.com',
            role='user',
            organization='测试部门',
            department='开发组'
        )
        regular_user.set_password('user123')
        db.session.add(regular_user)
        
        try:
            db.session.commit()
            print("✓ 默认用户创建成功！")
            print("\n默认账号信息：")
            print("  管理员: username=admin, password=admin123")
            print("  普通用户: username=user1, password=user123")
        except Exception as e:
            db.session.rollback()
            print(f"✗ 创建默认用户失败: {str(e)}")
    else:
        print("⚠️ users表未创建，请检查User模型定义")
    
    print("\n数据库初始化完成。现在可以启动服务了。")